#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long LL;
const int N = 2e5 + 10;
LL a[N], f[N];


int main()
{
    LL tol, mis; cin >> tol >> mis;
    for(int i = 1; i <= mis; i++) cin >> a[i];
    sort(a + 1, a + 1 + mis);
    f[1] = a[1] + 1;
    for(int i = 2; i <= mis; i++)
    {
        f[i] = a[i] + 1 + f[i - 1];
        for(int j = max(i - 25, 1); j < i; j++)
        {
            f[i] = min(f[i], a[i] + f[j - 1] + (LL)pow(i - j + 1, 4));
        }
    }
    cout << f[mis] << endl;
    return 0;
}


// #include <iostream>
// #include <algorithm>
// #include <cmath>
// using namespace std;
// typedef long long LL;
// const int N = 2e5 + 10;
// int a[N];

// bool cmp(int a, int b)
// {
//     return a > b;
// }

// int main()
// {
//     LL tol, mis; cin >> tol >> mis;
//     for(int i = 1; i <= mis; i++) cin >> a[i];
//     sort(a + 1, a + 1 + mis);
//     LL ans = 0, sinre = a[1] + 1, cnt = 1, mure = a[1] + 1;
//     for(int i = 2; i <= mis; i++)
//     {
//         // 尝试把下一个一起修
//         cnt++;
//         LL nmure = a[i] + pow(cnt, 4); 
//         // 单个修的费用
//         LL nsinre = sinre + a[i] + 1;
//         // 尝试下一个一起修，会比单个修花费更多
//         if(nmure > nsinre)
//         {
//             ans += mure;
//             mure = sinre = a[i] + 1;
//             cnt = 1;
//         }
//         else // 尝试加进来下一个，发现一起修更便宜 
//         {
//             mure = nmure;
//             sinre = nsinre;
//         }
//     }

//     cout << ans + mure << endl;
//     return 0;
// }